// Vue2.x对象的响应式是通过Object.defineProperty实现的，但是这个方法不能监听数组的改变
// 那数组怎么监听的呢?
// 数组操作一般都是push shift这些方法 这些方法是数组原生的方法 我们当然不能去改他 使用装饰器模式来增加扩展功能

var arrayProto = Array.prototype;   // 先拿到原生数组的原型
var arrObj = Object.create(arrayProto);  // 用原生数组的原型创建一个新对象 避免污染原生数组
var methods = ['push','shift'];          // 需要扩展的方法 

// 循环methods数组 扩展他们
methods.forEach((method)=>{
    arrObj[method] = function() {
        var result = arrayProto[method].apply(this,arguments);    // 先执行老方法
        dep.notify();
        return result;
    }
})

// 对于用户定义的数组 
var a = [1,2,3];
a.__proto__ = arrObj;